<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>无法拷贝方法和特殊对象</title>
</head>
<body>

</body>
<script>
// 使用 JSON 序列化（序列化和反序列化）进行深拷贝虽然是一个简单和方便的方法，但它也有一些缺点和局限性：
/**
 * 1. 无法拷贝方法和特殊对象
    (1)方法：对象的方法（函数）不会被拷贝。由于 JSON 仅支持基本数据类型和结构化数据，任何对象中的方法都将丢失。
    (2)特殊对象：某些特殊对象类型（如 Date、Map、Set、RegExp、Error 等）无法正确拷贝。
       这些对象会在序列化过程中被转换为普通对象或字符串，导致反序列化后无法恢复原始功能。
*/
// 例子：
const originalObject = {
  name: "Alice",
  age: 30, 
  dateOfBirth: new Date(1993, 5, 15),
  sayHello: function() {
    console.log(`Hello, my name is ${this.name}.`);
  },
  preferences: new Map([["theme", "dark"], ["notifications", true]]),
  regex: /abc/i
}
originalObject.sayHello();  // 输出: Hello, my name is Alice.
console.log("Date of Birth:", originalObject.dateOfBirth);  // 输出: Date 对象
console.log("Preferences:", originalObject.preferences);  // 输出: Map 对象
console.log("Regex:", originalObject.regex);  // 输出: /abc/i
console.log('originalObject', originalObject)

// 使用 JSON 序列化和反序列化进行深拷贝
const jsonString = JSON.stringify(originalObject);
const copiedObject = JSON.parse(jsonString);
console.log("Copied Object:", copiedObject);
// 尝试调用 sayHello 方法
try {
  copiedObject.sayHello();
} catch (error) {
  console.log(error.message);  // 输出: copiedObject.sayHello is not a function
}
// 通过这个例子可以看到，JSON 序列化和反序列化会导致对象中的方法和特殊对象（如 Date、Map、RegExp）
// 丢失或被转换成不正确的类型。如果需要保留这些特性，建议使用其他深拷贝方法或库。

// 解决方案：
// 使用自定义的序列化和反序列化函数来处理特殊类型。(无法解决)
const data = { date: new Date(), regex: /test/i };
const jsonString2 = JSON.stringify(data, (key, value) => {
  if (value instanceof Date) return value.toString();
  if (value instanceof RegExp) return value.toString();
  return value;
})

console.log(JSON.parse(jsonString2))
</script>
</html>